
先看這個網站的後端邏輯:
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so;
worker_processes 1;
events { worker_connections 1024; }
http {
include mime.types;
default_type application/octet-stream;
geoip2 /etc/nginx/GeoLite2-Country.mmdb {
auto_reload 5m;
$geoip2_data_country_code default=ZZ country iso_code;
}
upstream north {
server 127.0.0.1:8000;
}
upstream south {
server 127.0.0.1:9000;
}
server {
listen 80;
location / {
if ($geoip2_data_country_code = IS) {
proxy_pass http://south;
}
proxy_pass http://north;
}
}
}
重點在if
網站發現你在iceland會將你導向127.0.0.1:8000
如果不再就導向127.0.0.1:9000
這題是在考網路層的概念:
這題有點歧視窮人,因為如果你有vpn將自己設成iceland的節點就可以拿到flag了
(有錢能使鬼推磨法
----以下是窮人方法----
我一開始想到的方法是用curl -x改標頭再做http連線假裝我試冰島用戶 但這個方法只是在第七層application做手腳而已
curl -H "X-Forwarded-For: 82.221.131.71" \
-H "X-Real-IP: 82.221.131.71" \
-H "Client-IP: 82.221.131.71" \
-H "True-Client-IP: 82.221.131.71" \
http://cylabacademy.net<port>
網站會回傳No flag in this region!
->這題的Nginx伺服器配置了 ngx_http_geoip_module它不看標頭,它看跟你建立TCP連線的那個真實來源IP(即 $remote_addr)
因為Nginx根本不理會HTTP標頭裡的文字,所以你無論在-H後面塞什麼冰島IP,Nginx 看到的依然是你家裡的IP,因此會直接把你導向127.0.0.1:9000
這題檢查的是第四層transport我們變成得用tor或是vpn但我是個窮逼所以我們來講tor的方法:
請先在bash安裝tor這邊附上arch的安裝方式:sudo pacman -S tor
載好後我們需要更改tor得設定:sudo nano /etc/tor/torrc
滑到最下面加這兩行上去:
ExitNodes {is}
StrictNodes 0
這告訴tor優先選擇iceland的節點
如果要更決一點把0改成1強制使用冰島節點
然後重起tor:sudo systemctl restart tor
在連上網站:curl --socks5-hostname 127.0.0.1:9050 <port>

關鍵比較
| 選項 | DNS在哪解析 | 本地 ISP 能否看到你查的域名 |
|---|---|---|
--socks5 127.0.0.1:9050 |
本地解析成 IP,再把 IP 交给代理 | 能(DNS 泄露) |
--socks5-hostname 127.0.0.1:9050 |
代理端解析,域名原样发给代理 | 不能 |
所以在語法上加hostname是避免DNS泄露,配合Tor使用才能形成完整的匿名
最後我把flag做base64給你們除非真的一直失敗不然挑戰看看這題吧:
YWNhZGVteXtnMzBfYjQ1M2RfcjB1NzFuOV8zZDliZTM4M30=
歡迎在下面友善提問或討論0u0